#include "ProdutorConsumidor.h"


int count = 0; // Definindo o contador, ele tem que ser global pois vai servir tanto pra função do produtor quanto consumidor

int buffer[N]; // O buffer tem tamanho N

/*  A produção do item é feita por essa função produce_item , para simplificar ao máximo eu coloquei que o
item produzido terá sempre o valor do count ..... Os valores dos itens no vetor buffer, serão sempre esse count         */


int produce_item(){
    
    return random();  
    
}

// Função responsavel por inserir um item no buffer, ela apenas , insere este na posição count

void insert_item(int item){
     buffer[count] = item; 
     }

// Função que faz a remoção do item ,  retira o item que está na posição count do buffer

int remove_item(){
     int aux;
     aux = buffer[count];
     buffer[count]=-1;
     return aux;
     }
// Wakeup irá receber valores 1 ou 0 , 1 acorda o consumidor 0 acorda o produtor

void wakeup(int n){
     if(n==1) consumer();
     else producer();
     }
     
// consume_item irá imprimir o item consumido pelo consumidor     
     
void consume_item(int item){
    // printf("Elemento atualmente consumido pelo processo -> %d\n",item);
     }     


void sleep(int n){
     n=0;
     }

void producer(){
    // printf("############ PRODUCER ##############\n");
     int item; // Item inserido no Buffer
     int sleep=1; // Variavel para controle do while
     while(sleep == 1){ 
        item = produce_item();             // Item produzido
        if(count == N) {
                 wakeup(1);
                 sleep=0;                  // Se o buffer tiver cheio, produtor vai durmir
                 }// Acorda o consumidor
        insert_item(item);                 // Senão, insere item no buffer   
        
    //    printf("Elemento produzido -> %d\n",item);
        count += 1;                        // Incremente de 1 o contador
                  }
        //wakeup(1);  
          }

void consumer(){
//     printf("####### CONSUMIDOR  ###########\n\n");
     
     int item;                              // variavel para receber o item removido  
     int aux=1;                             // variavel de controle do laço while   
     while(aux == 1){  
          if(count == 0) aux = 0;        // Se o buffer tiver vazio vá durmir                      
          item = remove_item();             // item recebe o item removido   
          count -= 1;                       //Decremente count
          //if(count == N-1) wakeup(0);       //acorda o produtor
          consume_item(item);               // Imprime o item removido
               }
     
     
     
     }
